package cn.doyens.reggie.controller;

import cn.doyens.reggie.common.R;
import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {

    //3.在CommonController 中 通过@Value注解获取application.yml中指定名称的参数值 即文件保存路径
    @Value("${reggie.path}")
    private String basePath;

    /**
     *    图片上传功能方法
     *        分析: 将图片保存到服务器上的指定目录下
     *            1.获取文件文件名称 使用UUID工具类 为文件重命名
     *            2.在application.yml文件中 设置文件保存路径参数 保存路径为 d盘下的 imgs目录
     *            3.在CommonController 中 通过@Value注解获取application.yml中指定名称的参数值 即文件保存路径
     *            4.通过file对象调用方法 实现图片保存操作
     *            5.将图片名称 通过R对象携带返回给前端
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file){
        //1.获取文件文件名称 使用UUID工具类 为文件重命名
        String fileName = file.getOriginalFilename();
        String fileType = fileName.substring(fileName.lastIndexOf("."));
        fileName = UUID.randomUUID().toString().replace("-","")+fileType;

        //判断文件保存路径文件夹是否存在
        File fileDir = new File(basePath);//将文件夹封装成File类型 fileDir对象
        if(!fileDir.exists()){//判断该文件夹是否存在
            fileDir.mkdirs();//如果不存在 则 创建该目录
        }
        //4.通过file对象调用方法 实现图片保存操作
        try {
            file.transferTo(new File(fileDir,fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //5.将图片名称 通过R对象携带返回给前端
        return R.success(fileName);
    }


    /**
     *  图片下载的功能方法
     *     分析:
     *         1.通过FileInputStream流对象 读取服务器上指定目录下指定名称的图片资源数据
     *         2.通过response调用getOutputStream方法获取一个响应输出流对象 outputStream
     *         3.定义一个length变量 用于记录每次读取到的有效字节个数  当length值为-1时 读取操作结束
     *         4.定义一个byte数组 长度为1024 数组名称为arr 作用 每次最多读取1024个字节
     *         5. 通过response对象调用方法设置响应头字段 contextType  指定文集类型为 jepg类型
     *         6. 合理定义循环 通过fileInputStream流对象 读取文件中的数据  在通过outputStream流将读取的数据写出 响应返回给请求者即可
     *         7.  关闭流 释放资源
     * @param name
     * @param response
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response){
        //1.通过FileInputStream流对象 读取服务器上指定目录下指定名称的图片资源数据
        FileInputStream fis = null;
        // 2.通过response调用getOutputStream方法获取一个响应输出流对象 outputStream
        OutputStream fos = null;
        try{
            fis = new FileInputStream(basePath+name);
            fos = response.getOutputStream();
            //3.定义一个length变量 用于记录每次读取到的有效字节个数  当length值为-1时 读取操作结束
            int length = 0;
            //4.定义一个byte数组 长度为1024 数组名称为arr 作用 每次最多读取1024个字节
            byte[] arr = new byte[1024];
            // 5. 通过response对象调用方法设置响应头字段 contextType  指定文集类型为 jepg类型
            response.setContentType("image/jpeg");
            //6. 合理定义循环
            while((length = fis.read(arr))!=-1){
                fos.write(arr,0,length);//将arr数组中的有效字节写出到 流中
                fos.flush();//刷新
            }
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fis.close();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }



}
